/*
 * BrokerClienteEmisor.cpp
 *
 *  Created on: Jan 28, 2010
 *      Author: jgrande
 */

#include "BrokerCliente.h"

using middleware::common::PDUPuntoAPunto;

static bool terminar = false;

void emisor_sigint_handler(int signal) {
	logger << LogType::LOG_DEBUG_0 << "terminando proceso..." <<
			logger.endl;
	terminar = true;
}

void _brokerClienteEmisor(TCPSocket sock, Direccion dir);

pid_t brokerClienteEmisor(TCPSocket sock, Direccion dir) {
	pid_t pid;

	if((pid=fork())==0) {
		logger.set_pname("Middleware/Emisor");
		Utiles::registrar_signal(SIGINT, emisor_sigint_handler);
		_brokerClienteEmisor(sock, dir);
		exit(0);
	}

	return pid;
}

void _brokerClienteEmisor(TCPSocket sock, Direccion dir) {
	MiddlewareCliente& mw = MiddlewareClienteSingleton::instance();
	PDUPuntoAPunto pdu;

	logger << LogType::LOG_DEBUG_0 << "arrancando..." << logger.endl;

	mw.getLineas().put(dir, ParEmisorReceptor(getpid(), getppid()));
	mw.getSem().signal();

	forever {
		logger << LogType::LOG_DEBUG_0 <<"Esperando mensajes de tipo " << dir << " en cola..." << logger.endl;
		do {
			mw.getSnd().recv(&pdu, (long)dir, false, terminar);
		} while(!mw.getSnd() && errno==EINTR);

		if(!mw.getSnd()) {
			logger << LogType::LOG_ERROR <<"Error en MessageQueue.recv" << logger.err << logger.endl;
			sock.close();
			exit(0);
		}

		logger << LogType::LOG_DEBUG_0 <<"Enviando mensaje por socket..." << logger.endl;
		if(!sock.send(&pdu)) {
			logger << LogType::LOG_ERROR <<"Error en TCPSocket.send" << logger.err << logger.endl;
			//sock.close();
			//exit(0);
		} else {
			logger << LogType::LOG_DEBUG_0 <<"Mensaje enviado!" << logger.endl;
		}
	}
}
